import os  # 导入os模块，用于文件和操作系统交互


def load_employees(filename):  # 定义一个函数，用于从文件加载员工数据
    if not os.path.exists(filename):  # 检查文件是否存在
        return []  # 如果文件不存在，返回一个空列表
    with open(filename, 'r') as file:  # 以只读模式打开文件
        lines = file.readlines()  # 读取文件的所有行
        employees = []  # 初始化一个空列表用于存储员工数据
        for line in lines:  # 遍历每一行
            parts = line.strip().split(',')  # 去除行尾换行符并用逗号分割字符串
            if len(parts) == 5:  # 检查分割后的部分是否有5个元素
                employee = {  # 创建一个员工字典
                    'id': parts[0],  # 员工ID
                    'name': parts[1],  # 员工姓名
                    'position': parts[2],  # 员工职位
                    'salary': float(parts[3]),  # 员工薪资，转换为浮点数
                    'age': int(parts[4])  # 员工年龄，转换为整数
                }
                employees.append(employee)  # 将员工字典添加到员工列表中
        return employees  # 返回员工列表


def save_employees(filename, employees):  # 定义一个函数，用于保存员工数据到文件
    with open(filename, 'w') as file:  # 以写入模式打开文件
        for employee in employees:  # 遍历每一个员工字典
            line = f"{employee['id']},{employee['name']},{employee['position']},{employee['salary']},{employee['age']}\n"  # 格式化员工数据为字符串
            file.write(line)  # 将格式化的字符串写入文件


def add_employee(filename, employees, employee):  # 定义一个函数，用于添加员工
    employees.append(employee)  # 将新员工添加到员工列表中
    save_employees(filename, employees)  # 保存更新后的员工列表到文件


def remove_employee(filename, employees, employee_id):  # 定义一个函数，用于删除员工
    employees = [employee for employee in employees if employee['id'] != employee_id]  # 过滤掉要删除的员工
    save_employees(filename, employees)  # 保存更新后的员工列表到文件
    return employees  # 返回更新后的员工列表


def find_employee(employees, employee_id):  # 定义一个函数，用于查找员工
    return next((employee for employee in employees if employee['id'] == employee_id), None)  # 查找并返回员工，找不到返回None


def update_employee(filename, employees, employee_id, name=None, position=None, salary=None,
                    age=None):  # 定义一个函数，用于更新员工信息
    employee = find_employee(employees, employee_id)  # 查找员工
    if employee:  # 如果找到员工
        if name:  # 如果提供了新姓名
            employee['name'] = name  # 更新姓名
        if position:  # 如果提供了新职位
            employee['position'] = position  # 更新职位
        if salary is not None:  # 如果提供了新薪资
            employee['salary'] = salary  # 更新薪资
        if age is not None:  # 如果提供了新年龄
            employee['age'] = age  # 更新年龄
        save_employees(filename, employees)  # 保存更新后的员工列表到文件
        return True  # 返回True表示更新成功
    return False  # 返回False表示员工未找到


def filter_by_age(employees, min_age=None, max_age=None):  # 定义一个函数，用于按年龄筛选员工
    return [employee for employee in employees if (min_age is None or employee['age'] >= min_age) and (
                max_age is None or employee['age'] <= max_age)]  # 返回符合年龄条件的员工列表


def average_age(employees):  # 定义一个函数，用于计算员工的平均年龄
    if not employees:  # 如果没有员工
        return 0  # 返回0
    return sum(employee['age'] for employee in employees) / len(employees)  # 计算并返回平均年龄


def average_salary(employees):  # 定义一个函数，用于计算员工的平均薪资
    if not employees:  # 如果没有员工
        return 0  # 返回0
    return sum(employee['salary'] for employee in employees) / len(employees)  # 计算并返回平均薪资


def show_all_employees(employees):  # 定义一个函数，用于显示所有员工
    for employee in employees:  # 遍历每一个员工
        print(employee)  # 打印员工信息


def sort_by_salary(employees):  # 定义一个函数，用于按薪资排序员工
    return sorted(employees, key=lambda employee: employee['salary'])  # 返回按薪资排序后的员工列表


def filter_by_position(employees, position):  # 定义一个函数，用于按职位筛选员工
    return [employee for employee in employees if employee['position'] == position]  # 返回符合职位条件的员工列表


def highest_and_lowest_paid_employees(employees):  # 定义一个函数，用于查找薪资最高和最低的员工
    if not employees:  # 如果没有员工
        return None, None  # 返回None, None
    sorted_employees = sorted(employees, key=lambda employee: employee['salary'])  # 按薪资排序员工
    return sorted_employees[0], sorted_employees[-1]  # 返回薪资最低和最高的员工


def main_menu():  # 定义一个函数，用于显示主菜单并获取用户选择
    print("\n员工管理系统")  # 打印菜单标题
    print("1. 添加员工")  # 打印选项1
    print("2. 删除员工")  # 打印选项2
    print("3. 查找员工")  # 打印选项3
    print("4. 显示所有员工")  # 打印选项4
    print("5. 编辑员工信息")  # 打印选项5
    print("6. 按年龄筛选员工")  # 打印选项6
    print("7. 显示平均年龄和薪资")  # 打印选项7
    print("8. 按薪资排序员工")  # 打印选项8
    print("9. 按职位筛选员工")  # 打印选项9
    print("10. 显示最高和最低薪资的员工")  # 打印选项10
    print("11. 退出")  # 打印选项11
    return input("请输入您的选择: ")  # 获取用户选择并返回


def secondary_menu():  # 定义一个函数，用于显示编辑菜单并获取用户选择
    print("\n1. 修改姓名")  # 打印选项1
    print("2. 修改职位")  # 打印选项2
    print("3. 修改薪水")  # 打印选项3
    print("4. 修改年龄")  # 打印选项4
    print("5. 返回主菜单")  # 打印选项5
    return input("请输入您的选择: ")  # 获取用户选择并返回


def main():  # 定义主函数
    filename = 'employees.txt'  # 指定员工数据文件的文件名
    employees = load_employees(filename)  # 从文件加载员工数据

    while True:  # 无限循环，直到用户选择退出
        choice = main_menu()  # 显示主菜单并获取用户选择

        try:
            if choice == '1':  # 如果用户选择添加员工
                id = input("请输入员工ID: ")  # 获取员工ID
                name = input("请输入员工姓名: ")  # 获取员工姓名
                position = input("请输入员工职位: ")  # 获取员工职位
                salary = float(input("请输入员工薪水: "))  # 获取员工薪水，并转换为浮点数
                age = int(input("请输入员工年龄: "))  # 获取员工年龄，并转换为整数
                employee = {'id': id, 'name': name, 'position': position, 'salary': salary, 'age': age}  # 创建员工字典
                add_employee(filename, employees, employee)  # 添加员工
                print("员工添加成功。")  # 打印添加成功消息
            elif choice == '2':  # 如果用户选择删除员工
                id = input("请输入要删除员工的ID: ")  # 获取要删除的员工ID
                if find_employee(employees, id):  # 查找员工是否存在
                    employees = remove_employee(filename, employees, id)  # 删除员工
                    print("员工删除成功。")  # 打印删除成功消息
                else:
                    print("未找到该员工。")  # 如果未找到员工，打印错误消息
            elif choice == '3':  # 如果用户选择查找员工
                id = input("请输入要查找员工的ID: ")  # 获取要查找的员工ID
                employee = find_employee(employees, id)  # 查找员工
                if employee:
                    print(employee)  # 打印找到的员工信息
                else:
                    print("未找到员工。")  # 如果未找到员工，打印错误消息
            elif choice == '4':  # 如果用户选择显示所有员工
                show_all_employees(employees)  # 显示所有员工信息
            elif choice == '5':  # 如果用户选择编辑员工信息
                id = input("请输入要编辑信息的员工ID: ")  # 获取要编辑的员工ID
                employee = find_employee(employees, id)  # 查找员工
                if employee:
                    while True:  # 无限循环，直到用户选择返回主菜单
                        sub_choice = secondary_menu()  # 显示编辑菜单并获取用户选择
                        if sub_choice == '1':  # 如果用户选择修改姓名
                            new_name = input("请输入新的姓名: ")  # 获取新的姓名
                            update_employee(filename, employees, id, name=new_name)  # 更新员工姓名
                            print("姓名已更新。")  # 打印更新成功消息
                        elif sub_choice == '2':  # 如果用户选择修改职位
                            new_position = input("请输入新的职位: ")  # 获取新的职位
                            update_employee(filename, employees, id, position=new_position)  # 更新员工职位
                            print("职位已更新。")  # 打印更新成功消息
                        elif sub_choice == '3':  # 如果用户选择修改薪水
                            new_salary = float(input("请输入新的薪水: "))  # 获取新的薪水，并转换为浮点数
                            update_employee(filename, employees, id, salary=new_salary)  # 更新员工薪水
                            print("薪水已更新。")  # 打印更新成功消息
                        elif sub_choice == '4':  # 如果用户选择修改年龄
                            new_age = int(input("请输入新的年龄: "))  # 获取新的年龄，并转换为整数
                            update_employee(filename, employees, id, age=new_age)  # 更新员工年龄
                            print("年龄已更新。")  # 打印更新成功消息
                        elif sub_choice == '5':  # 如果用户选择返回主菜单
                            break  # 退出编辑循环，返回主菜单
                        else:
                            print("无效选择，请重新输入。")  # 如果用户输入无效，提示重新输入
                else:
                    print("未找到该员工。")  # 如果未找到员工，打印错误消息
            elif choice == '6':  # 如果用户选择按年龄筛选员工
                min_age = input("请输入最小年龄 (留空不筛选): ")  # 获取最小年龄
                max_age = input("请输入最大年龄 (留空不筛选): ")  # 获取最大年龄
                filtered_employees = filter_by_age(employees, int(min_age) if min_age else None,
                                                   int(max_age) if max_age else None)  # 筛选员工
                print("筛选结果:")  # 打印筛选结果标题
                for employee in filtered_employees:  # 遍历筛选后的员工
                    print(employee)  # 打印每一个员工的信息
            elif choice == '7':  # 如果用户选择显示平均年龄和薪资
                avg_age = average_age(employees)  # 计算平均年龄
                avg_salary = average_salary(employees)  # 计算平均薪资
                print(f"平均年龄: {avg_age}")  # 打印平均年龄
                print(f"平均薪资: {avg_salary}")  # 打印平均薪资
            elif choice == '8':  # 如果用户选择按薪资排序员工
                sorted_employees = sort_by_salary(employees)  # 按薪资排序员工
                print("按薪资排序后的员工列表:")  # 打印排序结果标题
                for employee in sorted_employees:  # 遍历排序后的员工
                    print(employee)  # 打印每一个员工的信息
            elif choice == '9':  # 如果用户选择按职位筛选员工
                position = input("请输入要筛选的职位: ")  # 获取要筛选的职位
                filtered_employees = filter_by_position(employees, position)  # 筛选员工
                print("筛选结果:")  # 打印筛选结果标题
                for employee in filtered_employees:  # 遍历筛选后的员工
                    print(employee)  # 打印每一个员工的信息
            elif choice == '10':  # 如果用户选择显示最高和最低薪资的员工
                highest_paid, lowest_paid = highest_and_lowest_paid_employees(employees)  # 查找最高和最低薪资的员工
                if highest_paid and lowest_paid:  # 如果找到员工
                    print("薪资最高的员工:")  # 打印最高薪资员工标题
                    print(highest_paid)  # 打印最高薪资员工信息
                    print("薪资最低的员工:")  # 打印最低薪资员工标题
                    print(lowest_paid)  # 打印最低薪资员工信息
                else:
                    print("没有员工信息。")  # 如果没有员工信息，打印错误消息
            elif choice == '11':  # 如果用户选择退出
                print("退出系统。")  # 打印退出系统消息
                break  # 退出主循环
            else:
                print("无效选择。请重新尝试。")  # 如果用户输入无效，提示重新输入

        except ValueError as e:  # 捕获输入值错误异常
            print(f"输入错误：{e}，请输入正确的信息。")  # 打印错误消息


if __name__ == "__main__":  # 判断是否以主程序运行
    main()  # 调用主函数
